/*
    This file is part of Epoch <http://code.google.com/p/epoch/>.
    
    Copyright (C) 2011  Adam Meily <meily.adam@gmail.com>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/


#include "Logger.h"
#include <QtCore/QDateTime>

Logger::Logger(QIODevice *device, Logger::Level lvl) : m_level(lvl)
{
    m_stream = new QTextStream(device);
}

Logger::~Logger()
{
    m_stream->flush();
    delete m_stream;
    if(m_device->isOpen())
        m_device->close();
    delete m_device;
}

Logger* Logger::init(QIODevice* device, Logger::Level lvl)
{
    if(!Instance)
        Instance = new Logger(device, lvl);
    return Instance;
}


Log* Logger::getLog(const QString& name)
{
    Log *log = new Log(&Instance, name);
    return log;
}

Logger* Logger::instance()
{
    return Instance;
}

void Logger::log(Logger::Level lvl, const QString& name, const QString& msg, int line)
{
    if(lvl < m_level)
        return;
    
    QDateTime now;
    QString levelStr;
    if(lvl == Info)
        levelStr = "info";
    else if(lvl == Debug)
        levelStr = "debug";
    else
        levelStr = "error";
    
    (*m_stream) << "[" << levelStr << "] {"
                << now.toString("MM/dd hh:mm:ss") << "} " << name;
    if(line >= 0)
        (*m_stream)  << " @" << line;
    
    (*m_stream) << ": " << msg << '\n';
}


Log::Log(Logger** logger, const QString& name) : m_name(name), m_logger(logger)
{
}

void Log::debug(const QString& msg, int line)
{
    (*m_logger)->log(Logger::Debug, m_name, msg, line);
}

void Log::error(const QString& msg, int line)
{
    (*m_logger)->log(Logger::Error, m_name, msg, line);
}

void Log::info(const QString& msg, int line)
{
    (*m_logger)->log(Logger::Info, m_name, msg, line);
}
